vt-d: avoid obtaining iommu->register_lock too early in
authorKeir Fraser <keir.fraser@citrix.com>
Mon, 7 Sep 2009 12:49:35 +0000 (13:49 +0100)
committerKeir Fraser <keir.fraser@citrix.com>
Mon, 7 Sep 2009 12:49:35 +0000 (13:49 +0100)
dma_msi_set_affinity()

If set_desc_affinity() fails, the current code doesn't release the
spinlock. We should obtain the lock at a later place.

Signed-off-by: Dexuan Cui <dexuan.cui@intel.com>
xen/drivers/passthrough/vtd/iommu.c

index b5131d86df98c91a8a424245c96c6ac04de42960..30370df584470aa9b11ec66c4920fd2e75a4244e 100644 (file)
@@ -826,7 +826,6 @@ static void dma_msi_set_affinity(unsigned int irq, cpumask_t mask)
     struct irq_desc *desc = irq_to_desc(irq);
     struct irq_cfg *cfg = desc->chip_data;
 
-    spin_lock_irqsave(&iommu->register_lock, flags);
 #ifdef CONFIG_X86
     dest = set_desc_affinity(desc, mask);
     if (dest == BAD_APICID){
@@ -862,6 +861,7 @@ static void dma_msi_set_affinity(unsigned int irq, cpumask_t mask)
     msg.address_lo |= dest << MSI_TARGET_CPU_SHIFT;
 #endif
 
+    spin_lock_irqsave(&iommu->register_lock, flags);
     dmar_writel(iommu->reg, DMAR_FEDATA_REG, msg.data);
     dmar_writel(iommu->reg, DMAR_FEADDR_REG, msg.address_lo);
     dmar_writel(iommu->reg, DMAR_FEUADDR_REG, msg.address_hi);